/*
 * TestTMTCDeliveryService_ut.cpp
 *
 *  Created on: 20/8/2012
 *      Author: Santiago Carmona Meco
 */



#include <public/config.h>


#include <public/edroomsl.h>
#include <public/edroom_glue.h>


//******************************************************************************
// include deployment edroom components

#include <public/casgi.h>
#include <public/caemuplanner.h>
#include <public/caemugs.h>
#include <public/caemutmtcserver.h>
#include <public/demo_saf_it.h>
#include <public/demo_saf.h>
#include <public/cassi.h>
#include <public/casensordemo.h>
#include <public/casgi.h>






#include <iostream>
#include <fstream>
using namespace std;


#define MAX 100
#define NUM_PRUEBAS 200000





Demo_SaF_it::Demo_SaF_it(const char * id, bool_t priority, bool_t setSeed,
		int32_t seed) : CUTBase(id,priority, setSeed, seed)
{
	// TODO Auto-generated constructor stub

}

Demo_SaF_it::~Demo_SaF_it() {
	// TODO Auto-generated destructor stub
}



bool_t Demo_SaF_it::DoTest(void)
{
	bool_t testOk=true;

	init_CRC_word16_table();

	image_to_frames_bidireccional();
	images_to_one_tc_packets();


	printf("\nComienza el envío de Telemetrías desde el sensor\n");


	CEDROOMSystemDeployment systemDeployment;


		Demo_SaF	comp1("MainActor_id1", 1, 10, EDROOMprioNormal, 10240, systemDeployment.GetComp1Memory());
		CASensorDemo	comp2("SensorDemo_id2", 2, 100, EDROOMprioNormal, 15360, systemDeployment.GetComp2Memory());
		CASSI	comp3("SSI_id3", 3, 100, EDROOMprioNormal, 10240, systemDeployment.GetComp3Memory());
		CAEmuTMTCServer	comp4("EmuTMTCServer_id4", 4, 10, EDROOMprioNormal, 10240, systemDeployment.GetComp4Memory());
		CAEmuGS	comp5("EmuGS_id5", 5, 10, EDROOMprioNormal, 10240, systemDeployment.GetComp5Memory());
		CASGI	comp6("SGI_id6", 6, 10, EDROOMprioNormal, 10240, systemDeployment.GetComp6Memory());
		CAEmuPlanner	comp7("EmuPlanner_id7", 7, 10, EDROOMprioNormal, 10240, systemDeployment.GetComp7Memory());

		systemDeployment.Config(&comp1, &comp2, &comp3, &comp4, &comp5, &comp6, &comp7);

		systemDeployment.Start();



	return testOk;

}




void	int_to_char32(int32_t num,byte_t * cConvert)

{
	byte_t aux;
	int32_t i=0;
	int32_t j;

	do
	{
		cConvert[i++]= (num % 10) + '0';
		num=num/10;
	}
	while (num>0);
	cConvert[i--]='\0';
	j=0;
	for (;i>j;i--,j++)
	{
		aux=cConvert[i];
		cConvert[i]=cConvert[j];
		cConvert[j]=aux;
	}

}
void int_to_char(int num, char * pConvert)
{
	char aux;
	int32_t i = 0;
	int32_t j = 0;

	do
	{
		pConvert[i++] = (num % 10) + '0';
		num = num / 10;
	}
	while (num > 0);

	pConvert[i--] = '\0';

	for (j = 0; i > j; i--, j++)
	{
		aux = pConvert[i];
		pConvert[i] = pConvert[j];
		pConvert[j] = aux;
	}
}


void build_frame_bidireccional (char *p_datosLeidos, int bytesLeidos,byte_t *frameFinal)
{
  struct ssi_link_layer_data_frame_info_t tramaNueva;

  strcpy((char*)tramaNueva.radio_id,"000001");
  tramaNueva.sensor_id=MASK_BIDIRECTIONAL_SSI;// -> id de sensor bidireccional
  tramaNueva.flags=MASK_DATA_SSI;//00001000->is data
  strcpy((char*)tramaNueva.reserved,"000000");
  for (int i=0; i<32 ; i++)
  {
    tramaNueva.data[i] =p_datosLeidos[i];
  }
  tramaNueva.length=bytesLeidos;
  ssi_link_layer_build_data_frame(frameFinal, &tramaNueva);

}





void image_to_frames_bidireccional ()
{
  FILE *fichero,*ficheroAuxiliar;
  char aux[10];
  byte_t trama[50];
  char nombreFichero[40];
  char buffer[32];
  int i,j,bytesLeidos,aleatorio;


  fclose(fopen("InterTM.jpg","wb"));//para eliminar el archivo destino que existiera
  fichero=fopen("OUpFrames.jpg","rb");
  if(fichero!=NULL)
  {
    j=1;
	do
    {
      for (i=0;i<32;i++)
      {
    	  buffer[i]=0;
      }
      for (i=0;i<40;i++)
	  {
    	 nombreFichero[i]=0;
	  }
	  strcpy(nombreFichero,"UpFrames/");
	  int_to_char(j,aux);
	  strcat(nombreFichero,aux);
	  ficheroAuxiliar=fopen(nombreFichero,"wb");
	  if (ficheroAuxiliar!=NULL)
	  {
		   	   if (j % 200 == 0 )
			   {
				   aleatorio = rand()%48;
				   trama[aleatorio]=trama[aleatorio]+1;//para cambiar el contenido y que falle el crc
			   }
			   else
			   {
				  bytesLeidos = fread(buffer, 1,(rand()%30)+1,fichero);
				  build_frame_bidireccional(buffer,bytesLeidos,trama);
			   }

		   	fwrite(trama, 1,50, ficheroAuxiliar);
		   	fclose (ficheroAuxiliar);
	  }
	  j++;
    }
	while (!feof(fichero));
	fclose(fichero);
  }


}

void images_to_multi_tc_packets(void)
{

	FILE *fichero,*ficheroAuxiliar;
	char aux[10];
	char nombreFichero[40];
	char buffer[254];
	byte_t contadorHex=0x01;
	int i,j;
	word16_t bytesLeidos;

	fclose(fopen("FMultiTC.jpg","wb"));//para eliminar el archivo destino que existiera
	fichero=fopen("OMultiTC.jpg","rb");
	if (fichero==NULL)
	{
		////printf("Error al intentar abrir el archivo\n");
	}
	else
	{
		j=1;
		do
		{
			for (i=0;i<254;i++)
			{
				buffer[i]=0;
			}
			for (i=0;i<40;i++)
			{
				nombreFichero[i]=0;
			}
			strcpy(nombreFichero,"MultiTC/");
			int_to_char(j,aux);
			strcat(nombreFichero,aux);
			ficheroAuxiliar=fopen(nombreFichero,"wb");
			if (ficheroAuxiliar==NULL)
			{
				////printf("Error al intentar abrir el archivo\n");
			}
			else
			{
				bytesLeidos = fread(buffer, 1,250,fichero);
				#ifdef CONFIG_PLATFORM_IS_LITTLE_ENDIAN
					putc(contadorHex,ficheroAuxiliar);
					putc(0x00,ficheroAuxiliar);
					putc(bytesLeidos,ficheroAuxiliar);
					putc(0x00,ficheroAuxiliar);
				#else
					putc(0x00,ficheroAuxiliar);
					putc(contadorHex,ficheroAuxiliar);
					putc(0x00,ficheroAuxiliar);
					putc(bytesLeidos,ficheroAuxiliar);
				#endif
				fwrite(buffer, 1,bytesLeidos, ficheroAuxiliar);
				fclose (ficheroAuxiliar);

			}
			j++;
			contadorHex++;
		}
		while (!feof(fichero));
		fclose(fichero);
	}


}


void image_to_frames_bidireccional_desc ()
{
  FILE *fichero,*ficheroAuxiliar;
  char aux[10];
  byte_t trama[50];
  char nombreFichero[40];
  char buffer[32];
  int i,j,bytesLeidos,aleatorio;


  fclose(fopen("FDwFrames.jpg","wb"));//para eliminar el archivo destino que existiera
  fichero=fopen("FOneTC.jpg","rb");
  srand(1);
  if (fichero==NULL)
  {
    printf("Error al intentar abrir el archivo\n");
  }
  else
  {
    j=1;
	do
    {
      for (i=0;i<32;i++)
      {
    	  buffer[i]=0;
      }
      for (i=0;i<40;i++)
	  {
    	 nombreFichero[i]=0;
	  }
	  strcpy(nombreFichero,"DwFrames/");
	  int_to_char(j,aux);
	  strcat(nombreFichero,aux);
	  ficheroAuxiliar=fopen(nombreFichero,"wb");
	  if (ficheroAuxiliar==NULL)
	  {
	    printf("DEMO:Error al intentar abrir el archivo\n");
	  }
	  else
	  {
		   	   if (j % 30 == 0 )
			   {
				   aleatorio = rand()%48;
				   trama[aleatorio]=trama[aleatorio]+1;//para cambiar el contenido y que falle el crc
			   }
			   else
			   {
				  bytesLeidos = fread(buffer, 1,(rand()%30)+1,fichero);
				  build_frame_bidireccional(buffer,bytesLeidos,trama);
			   }

		   	fwrite(trama, 1,50, ficheroAuxiliar);
		   	fclose (ficheroAuxiliar);
	  }
	  j++;
    }
	while (!feof(fichero));

	fclose(fichero);
  }


}


void images_to_one_tc_packets(void)
{

	FILE *fichero,*ficheroAuxiliar;
	char aux[10];
	char nombreFichero[40];
	char buffer[254];
	byte_t contadorHex=0x01;
	int i,j;
	word16_t bytesLeidos;

	fclose(fopen("FOneTC.jpg","wb"));//para eliminar el archivo destino que existiera
	fichero=fopen("OOneTC.jpg","rb");
	if (fichero==NULL)
	{
		////printf("Error al intentar abrir el archivo\n");
	}
	else
	{
		j=1;
		do
		{
			for (i=0;i<254;i++)
			{
				buffer[i]=0;
			}
			for (i=0;i<40;i++)
			{
				nombreFichero[i]=0;
			}
			strcpy(nombreFichero,"OneTC/");
			int_to_char(j,aux);
			strcat(nombreFichero,aux);
			ficheroAuxiliar=fopen(nombreFichero,"wb");
			if (ficheroAuxiliar==NULL)
			{
				////printf("Error al intentar abrir el archivo\n");
			}
			else
			{
				bytesLeidos = fread(buffer, 1,250,fichero);
				#ifdef CONFIG_PLATFORM_IS_LITTLE_ENDIAN
					putc(contadorHex,ficheroAuxiliar);
					putc(0x00,ficheroAuxiliar);
					putc(bytesLeidos,ficheroAuxiliar);
					putc(0x00,ficheroAuxiliar);
				#else
					putc(0x00,ficheroAuxiliar);
					putc(contadorHex,ficheroAuxiliar);
					putc(0x00,ficheroAuxiliar);
					putc(bytesLeidos,ficheroAuxiliar);
				#endif
				fwrite(buffer, 1,bytesLeidos, ficheroAuxiliar);
				fclose (ficheroAuxiliar);

			}
			j++;
			contadorHex++;
		}
		while (!feof(fichero));
		fclose(fichero);
	}


}



void images_to_one_tm_packets(void)
{

	FILE *fichero,*ficheroAuxiliar;
	char aux[10];
	char nombreFichero[40];
	char buffer[254];
	byte_t contadorHex=0x01;
	int i,j;
	word16_t bytesLeidos;

	fclose(fopen("FOneTM.jpg","wb"));//para eliminar el archivo destino que existiera
	fichero=fopen("OOneTM.jpg","rb");
	if (fichero==NULL)
	{
		////printf("Error al intentar abrir el archivo\n");
	}
	else
	{
		j=1;
		do
		{
			for (i=0;i<254;i++)
			{
				buffer[i]=0;
			}
			for (i=0;i<40;i++)
			{
				nombreFichero[i]=0;
			}
			strcpy(nombreFichero,"OneTM/");
			int_to_char(j,aux);
			strcat(nombreFichero,aux);
			ficheroAuxiliar=fopen(nombreFichero,"wb");
			if (ficheroAuxiliar==NULL)
			{
				////printf("Error al intentar abrir el archivo %d \n",nombreFichero);
			}
			else
			{
				bytesLeidos = fread(buffer, 1,250,fichero);
				#ifdef CONFIG_PLATFORM_IS_LITTLE_ENDIAN
					putc(contadorHex,ficheroAuxiliar);
					putc(0x00,ficheroAuxiliar);
					putc(bytesLeidos,ficheroAuxiliar);
					putc(0x00,ficheroAuxiliar);
				#else
					putc(0x00,ficheroAuxiliar);
					putc(contadorHex,ficheroAuxiliar);
					putc(0x00,ficheroAuxiliar);
					putc(bytesLeidos,ficheroAuxiliar);
				#endif

				fwrite(buffer, 1,bytesLeidos, ficheroAuxiliar);
				fclose (ficheroAuxiliar);
			}
			j++;
			contadorHex++;
		}
		while (!feof(fichero));
		fclose(fichero);
	}


}





void images_to_sen_tc_packets(void)
{

	FILE *fichero,*ficheroAuxiliar;
	char aux[10];
	char nombreFichero[40];
	char buffer[254];
	byte_t contadorHex=0x01;
	int i,j;
	word16_t bytesLeidos;

	fclose(fopen("FinalTC.jpg","wb"));//para eliminar el archivo destino que existiera
	fichero=fopen("ascendente.jpg","rb");
	if (fichero==NULL)
	{
		////printf("Error al intentar abrir el archivo\n");
	}
	else
	{
		j=1;
		do
		{
			for (i=0;i<254;i++)
			{
				buffer[i]=0;
			}
			for (i=0;i<40;i++)
			{
				nombreFichero[i]=0;
			}
			strcpy(nombreFichero,"tcPacks2/");
			int_to_char(j,aux);
			strcat(nombreFichero,aux);
			ficheroAuxiliar=fopen(nombreFichero,"wb");
			if (ficheroAuxiliar==NULL)
			{
				////printf("Error al intentar abrir el archivo\n");
			}
			else
			{
				bytesLeidos = fread(buffer, 1,250,fichero);
				#ifdef CONFIG_PLATFORM_IS_LITTLE_ENDIAN
					putc(contadorHex,ficheroAuxiliar);
					putc(0x00,ficheroAuxiliar);
					putc(bytesLeidos,ficheroAuxiliar);
					putc(0x00,ficheroAuxiliar);
				#else
					putc(0x00,ficheroAuxiliar);
					putc(contadorHex,ficheroAuxiliar);
					putc(0x00,ficheroAuxiliar);
					putc(bytesLeidos,ficheroAuxiliar);
				#endif
				fwrite(buffer, 1,bytesLeidos, ficheroAuxiliar);
				fclose (ficheroAuxiliar);

			}
			j++;
			contadorHex++;
		}
		while (!feof(fichero));
		fclose(fichero);
	}


}



void images_to_sen_tm_packets(void)
{

	FILE *fichero,*ficheroAuxiliar;
	char aux[10];
	char nombreFichero[40];
	char buffer[254];
	byte_t contadorHex=0x01;
	int i,j;
	word16_t bytesLeidos;

	fclose(fopen("FinalTM.jpg","wb"));//para eliminar el archivo destino que existiera
	fichero=fopen("descendente.jpg","rb");
	if (fichero==NULL)
	{
		////printf("Error al intentar abrir el archivo\n");
	}
	else
	{
		j=1;
		do
		{
			for (i=0;i<254;i++)
			{
				buffer[i]=0;
			}
			for (i=0;i<40;i++)
			{
				nombreFichero[i]=0;
			}
			strcpy(nombreFichero,"tmPacks2/");
			int_to_char(j,aux);
			strcat(nombreFichero,aux);
			ficheroAuxiliar=fopen(nombreFichero,"wb");
			if (ficheroAuxiliar==NULL)
			{
				////printf("Error al intentar abrir el archivo %d \n",nombreFichero);
			}
			else
			{
				bytesLeidos = fread(buffer, 1,250,fichero);
				#ifdef CONFIG_PLATFORM_IS_LITTLE_ENDIAN
					putc(contadorHex,ficheroAuxiliar);
					putc(0x00,ficheroAuxiliar);
					putc(bytesLeidos,ficheroAuxiliar);
					putc(0x00,ficheroAuxiliar);
				#else
					putc(0x00,ficheroAuxiliar);
					putc(contadorHex,ficheroAuxiliar);
					putc(0x00,ficheroAuxiliar);
					putc(bytesLeidos,ficheroAuxiliar);
				#endif
				fwrite(buffer, 1,bytesLeidos, ficheroAuxiliar);
				fclose (ficheroAuxiliar);
			}
			j++;
			contadorHex++;
		}
		while (!feof(fichero));
		fclose(fichero);
	}


}


void join_multi_tc_files()

{
	FILE *fichero;
	byte_t data[252];
	int32_t i=1;

	while(i<=125)//buscar una forma de contar el numero de ficheros del directorio
	{
		fichero=fopen("FMultiTC.jpg","ab");
		get_multi_tc_files(i,data);
		if (fichero==NULL)
		{
			////printf("Error al intentar abrir el archivo imagen.jpg\n");
		}
		else
		{
			fwrite(data+2,1,data[0], fichero);
			fclose(fichero);
		}

		i++;
	}
}



void join_multi_tm_files()

{
	FILE *fichero;
	byte_t data[252];
	int32_t i=1;

	while(i<=96)
	{
	   fichero=fopen("Final.jpg","ab");
	   get_multi_tm_files(i,data);
   	if (fichero==NULL)
   	{
	 		////printf("Error al intentar abrir el archivo imagen.jpg\n");
   	}
   	else
   	{
			fwrite(data+2,1,data[0], fichero);
			fclose(fichero);
		}

		i++;
	}
}




void	get_multi_tc_files(int32_t numeroFichero,byte_t *mensaje)

{
	FILE *fichero;
   char ruta[50];
    char aux[10];

   strcpy(ruta,"EndMultiTC/");
   int_to_char(numeroFichero,aux);
   strcat(ruta,(char *)aux);

	fichero=fopen(ruta,"rb");
   if (fichero==NULL)
   {
	   printf("TestSgiSatelliteControl: ERROR AL ABRIR EL FICHERO %s\n",ruta);
   }
   else
   {
		 fread(mensaje,1,252,fichero);
		 fclose(fichero);
 	}


}




void	get_multi_tm_files(int32_t numeroFichero,byte_t *mensaje)

{
	FILE *fichero;
   char ruta[50];
   char aux[10];

	strcpy(ruta,"EndMultiTM/");
	int_to_char(numeroFichero,aux);
   strcat(ruta,(char *)aux);

	fichero=fopen(ruta,"rb");
   if (fichero==NULL)
   {
	   printf("TestSgiSatelliteControl: ERROR AL ABRIR EL FICHERO %s\n",ruta);


   }
   else
   {
		 fread(mensaje,1,252,fichero);
		 fclose(fichero);
 	}



}


bool_t check_multi_tc_files()

{
	FILE *originFile,*finalFile;
	bool_t ok=true;
	byte_t originBuffer[50], finalBuffer[50];

	finalFile=fopen("FMultiTC.jpg","rb");
	originFile=fopen("OMultiTC.jpg","rb");
	do
	{
	   for (int32_t i =0; i< 50; i++)
	   {
		   originBuffer[i]=0;
		   finalBuffer[i]=0;
	   }
	   fread(originBuffer, 1,1, originFile);
	   fread(finalBuffer, 1,1, finalFile);
	   if(originBuffer[0]!=finalBuffer[0])
	   {
		   ok=false;
	   }
	}
	while (!feof(originFile) && !feof(finalFile));
	fclose(originFile);
	fclose(finalFile);
	if (ok)
	{
	   return true;
	}
	else
	{
	   return false;
	}
}




bool_t check_multi_tm_files()

{
	FILE *originFile,*finalFile;
	bool_t ok=true;
	byte_t originBuffer[50], finalBuffer[50];

	finalFile=fopen("Final.jpg","rb");
	originFile=fopen("OUpFrames.jpg","rb");
	do
	{
	   for (int32_t i =0; i< 50; i++)
	   {
		   originBuffer[i]=0;
		   finalBuffer[i]=0;
	   }
	   fread(originBuffer, 1,1, originFile);
	   fread(finalBuffer, 1,1, finalFile);
	   if(originBuffer[0]!=finalBuffer[0])
	   {
		   ok=false;
	   }
	}
	while (!feof(originFile) && !feof(finalFile));
	fclose(originFile);
	fclose(finalFile);
	if (ok)
	{
	   return true;
	}
	else
	{
	   return false;
	}
}










void join_one_tc_files()

{
	FILE *fichero;
	byte_t data[252];
	int32_t i=1;

	while(i<=13)//buscar una forma de contar el numero de ficheros del directorio
	{
		DEBUG("");
		fichero=fopen("FOneTC.jpg","ab");
		get_one_tc_files(i,data);
		if (fichero==NULL)
		{
			printf("Error al intentar abrir el archivo FOneTC.jpg\n");
		}
		else
		{
			fwrite(data+2,1,data[0], fichero);
			fclose(fichero);
		}

		i++;
	}
}



void join_one_tm_files()

{
	FILE *fichero;
	byte_t data[252];
	int32_t i=1;

	while(i<=12)
	{
	   fichero=fopen("FOneTM.jpg","ab");
	   get_one_tm_files(i,data);
   	if (fichero==NULL)
   	{
	 		//printf("Error al intentar abrir el archivo FOneTM.jpg\n");
   	}
   	else
   	{
			fwrite(data+2,1,data[0], fichero);
		   	fclose(fichero);
		}

		i++;
	}
}




void	get_one_tc_files(int32_t numeroFichero,byte_t *mensaje)

{
	FILE *fichero;
   char ruta[50];
   char aux[10];

   strcpy(ruta,"EndOneTC/");
   int_to_char(numeroFichero,aux);
   strcat(ruta,(char *)aux);

	fichero=fopen(ruta,"rb");
   if (fichero==NULL)
   {
	//printf("TestSgiSatelliteControl: ERROR AL ABRIR EL FICHERO %s\n",ruta);
   }
   else
   {
		 fread(mensaje,1,252,fichero);
		  fclose(fichero);
 	}


}




void	get_one_tm_files(int32_t numeroFichero,byte_t *mensaje)

{
	FILE *fichero;
   char ruta[50];
   char aux[10];

	strcpy(ruta,"EndOneTM/");
	int_to_char(numeroFichero,aux);
   strcat(ruta,(char *)aux);

	fichero=fopen(ruta,"rb");
   if (fichero==NULL)
   {
	   //printf("TestSgiSatelliteControl: ERROR AL ABRIR EL FICHERO %s\n",ruta);


   }
   else
   {
		 fread(mensaje,1,252,fichero);
		  fclose(fichero);
 	}



}


bool_t check_one_tc_files()

{
	FILE *originFile,*finalFile;
	bool_t ok=true;
	byte_t originBuffer[50], finalBuffer[50];

	finalFile=fopen("FOneTC.jpg","rb");
	originFile=fopen("OOneTC.jpg","rb");
	do
	{
	   for (int32_t i =0; i< 50; i++)
	   {
		   originBuffer[i]=0;
		   finalBuffer[i]=0;
	   }
	   fread(originBuffer, 1,1, originFile);
	   fread(finalBuffer, 1,1, finalFile);
	   if(originBuffer[0]!=finalBuffer[0])
	   {
		   ok=false;
	   }
	}
	while (!feof(originFile) && !feof(finalFile));
	fclose(originFile);
	fclose(finalFile);
	if (ok)
	{
	   return true;
	}
	else
	{
	   return false;
	}
}




bool_t check_one_tm_files()

{
	FILE *originFile,*finalFile;
	bool_t ok=true;
	byte_t originBuffer[50], finalBuffer[50];

	finalFile=fopen("FOneTM.jpg","rb");
	originFile=fopen("OOneTM.jpg","rb");
	do
	{
	   for (int32_t i =0; i< 50; i++)
	   {
		   originBuffer[i]=0;
		   finalBuffer[i]=0;
	   }
	   fread(originBuffer, 1,1, originFile);
	   fread(finalBuffer, 1,1, finalFile);
	   if(originBuffer[0]!=finalBuffer[0])
	   {
		   ok=false;
	   }
	}
	while (!feof(originFile) && !feof(finalFile));
	fclose(originFile);
	fclose(finalFile);
	if (ok)
	{
	   return true;
	}
	else
	{
	   return false;
	}
}



